package com.learning.dubbo.features.filter.api;

import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.Filter;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcException;

import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;
import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER;

/**
 * ClassName: DubboFilter
 * Description: 自定义Filter
 * <p>
 * 1. 用户自定义 filter 默认在内置 filter 之后。
 * 2. 特殊值 default ，表示缺省扩展点插入的位置。比如： filter="xxx,default,yyy" ，表示 xxx 在缺省 filter 之前， yyy 在缺省 filter 之后。
 * 3. 特殊符号 - ，表示剔除。比如： filter="-foo1" ，剔除添加缺省扩展点 foo1 。比如：filter="-default" ，剔除添加所有缺省扩展点。
 * 4. provider 和 service 同时配置的 filter 时，累加所有 filter，而不是覆盖。比如：
 * <dubbo:provider filter="xxx,yyy"/> 和 <dubbo:service filter="aaa,bbb"/> ，则 xxx , yyy , aaa , bbb 均会生效。
 * 如果要覆盖，需配置： <dubbo:service filter="-xxx,-yyy,aaa,bbb" />
 * <p>
 * Date: 2020/7/8 14:13 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
@Activate(group = {CONSUMER, PROVIDER})
public class DubboFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {

        System.out.println("~~~~~~~~~~~ before filter ...~~~~~~~~~~");
        Result result = invoker.invoke(invocation);
        System.out.println("~~~~~~~~~~~ after filter ...~~~~~~~~~~");
        return result;
    }
}
